/**
 * 应用配置存储
 * 使用 electron-store 存储用户配置、AI设置等轻量数据
 *
 * 特点:
 * - 纯JavaScript实现,无需编译
 * - 自动持久化到JSON文件
 * - 支持类型安全的配置访问
 * - 文件位置: ~/Library/Application Support/融媒智创工坊/config.json
 *
 * 注意: electron-store v9+ 是ES模块,需要使用动态导入
 * 这里使用简单的JSON文件操作代替,保持CommonJS兼容性
 */

import { app } from 'electron'
import { join } from 'path'
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs'

/**
 * 应用配置结构
 */
export interface AppConfig {
  // AI设置
  ai?: {
    apiKey?: string
    baseUrl?: string
    model?: string
    temperature?: number
    maxTokens?: number
  }

  // 窗口状态
  window?: {
    width?: number
    height?: number
    x?: number
    y?: number
    maximized?: boolean
  }

  // 编辑器偏好
  editor?: {
    fontSize?: number
    theme?: 'light' | 'dark'
    wordWrap?: boolean
    autoSave?: boolean
    autoSaveDelay?: number
  }

  // 最近打开的文档
  recent?: {
    documentIds?: string[]
    lastOpenedId?: string
  }

  // 应用偏好
  preferences?: {
    language?: 'zh-CN' | 'en-US'
    showWelcome?: boolean
    telemetry?: boolean
  }
}

/**
 * 默认配置
 */
const defaultConfig: AppConfig = {
  ai: {
    baseUrl: 'https://api.siliconflow.cn/v1',
    model: 'Qwen/Qwen2.5-7B-Instruct',
    temperature: 0.7,
    maxTokens: 2000
  },
  editor: {
    fontSize: 14,
    theme: 'light',
    wordWrap: true,
    autoSave: true,
    autoSaveDelay: 3000
  },
  preferences: {
    language: 'zh-CN',
    showWelcome: true,
    telemetry: false
  }
}

/**
 * 配置存储单例
 * 使用原生fs操作JSON文件
 */
class ConfigStore {
  private configPath: string
  private config: AppConfig

  constructor() {
    // 获取用户数据目录
    const userDataPath = app.getPath('userData')
    this.configPath = join(userDataPath, 'config.json')

    // 确保目录存在
    if (!existsSync(userDataPath)) {
      mkdirSync(userDataPath, { recursive: true })
    }

    // 加载或初始化配置
    this.config = this.loadConfig()

    console.log('[ConfigStore] 配置文件路径:', this.configPath)
  }

  /**
   * 从文件加载配置
   */
  private loadConfig(): AppConfig {
    try {
      if (existsSync(this.configPath)) {
        const data = readFileSync(this.configPath, 'utf-8')
        const loaded = JSON.parse(data) as AppConfig
        // 合并默认配置,确保新增字段存在
        return { ...defaultConfig, ...loaded }
      }
    } catch (error) {
      console.warn('[ConfigStore] 加载配置失败,使用默认配置', error)
    }
    return defaultConfig
  }

  /**
   * 保存配置到文件
   */
  private saveConfig(): void {
    try {
      const data = JSON.stringify(this.config, null, 2)
      writeFileSync(this.configPath, data, 'utf-8')
    } catch (error) {
      console.error('[ConfigStore] 保存配置失败', error)
    }
  }

  /**
   * 获取完整配置
   */
  getAll(): AppConfig {
    return { ...this.config }
  }

  /**
   * 获取特定配置项
   */
  get<K extends keyof AppConfig>(key: K): AppConfig[K] | undefined {
    return this.config[key]
  }

  /**
   * 设置配置项
   */
  set<K extends keyof AppConfig>(key: K, value: AppConfig[K]): void {
    this.config[key] = value
    this.saveConfig()
    console.log(`[ConfigStore] 已更新配置: ${String(key)}`)
  }

  /**
   * 删除配置项
   */
  delete<K extends keyof AppConfig>(key: K): void {
    delete this.config[key]
    this.saveConfig()
    console.log(`[ConfigStore] 已删除配置: ${String(key)}`)
  }

  /**
   * 重置所有配置
   */
  reset(): void {
    this.config = { ...defaultConfig }
    this.saveConfig()
    console.log('[ConfigStore] 配置已重置为默认值')
  }

  /**
   * 获取AI配置
   */
  getAIConfig() {
    return this.get('ai') || defaultConfig.ai
  }

  /**
   * 设置AI配置
   */
  setAIConfig(config: AppConfig['ai']): void {
    this.set('ai', { ...this.getAIConfig(), ...config })
  }

  /**
   * 获取编辑器配置
   */
  getEditorConfig() {
    return this.get('editor') || defaultConfig.editor
  }

  /**
   * 设置编辑器配置
   */
  setEditorConfig(config: AppConfig['editor']): void {
    this.set('editor', { ...this.getEditorConfig(), ...config })
  }

  /**
   * 保存窗口状态
   */
  saveWindowState(bounds: { width: number; height: number; x: number; y: number }, maximized: boolean): void {
    this.set('window', { ...bounds, maximized })
  }

  /**
   * 获取窗口状态
   */
  getWindowState() {
    return this.get('window')
  }

  /**
   * 添加到最近文档
   */
  addRecentDocument(documentId: string): void {
    const recent = this.get('recent') || {}
    const documentIds = recent.documentIds || []

    // 移除已存在的
    const filtered = documentIds.filter(id => id !== documentId)

    // 添加到开头
    filtered.unshift(documentId)

    // 限制数量
    const limited = filtered.slice(0, 10)

    this.set('recent', {
      documentIds: limited,
      lastOpenedId: documentId
    })
  }

  /**
   * 获取最近文档列表
   */
  getRecentDocuments(): string[] {
    const recent = this.get('recent')
    return recent?.documentIds || []
  }

  /**
   * 获取配置文件路径
   */
  getConfigPath(): string {
    return this.configPath
  }
}

// 导出单例实例
export const configStore = new ConfigStore()
export default configStore
